package xin.qixia.builder.controller;

import com.lowagie.text.Document;
import com.lowagie.text.Font;
import com.lowagie.text.Image;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfWriter;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import xin.qixia.builder.utils.PdfTableBuilder;

import java.io.IOException;
import java.util.List;

/**
 * @author wangkaixin
 * @date 2025/7/9 11:23
 */
@RestController
@RequestMapping
public class IndexController {

    public static Font baseFont;

    public IndexController() {
        try {
            baseFont = new Font(BaseFont.createFont(
                    ResourceUtils.getFile("classpath:fonts/simsun.ttc").getAbsolutePath() + ",0",
                    BaseFont.IDENTITY_H, BaseFont.EMBEDDED));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @GetMapping("/builder")
    public void builder(HttpServletResponse response) throws IOException {
        Document document = new Document();
        PdfWriter.getInstance(document, response.getOutputStream());
        document.open();

        PdfPCell image = new PdfPCell();
        image.setImage(Image.getInstance(ResourceUtils.getFile("classpath:images/y.jpg").getAbsolutePath()));

        // 1. 初始化表格（10列）
        PdfTableBuilder builder = new PdfTableBuilder(10, baseFont);
        // 2. 逐行添加单元格
        builder.addRow(List.of("第1行第1列", "第1行第2列", "第1行第3列", "第1行第4列", "第1行第5列", "", "", "", "", "第1行第10列"));
        builder.addRow(List.of("", "", "", "", "第2行第5列", "第2行第6列", "第2行第7列", "第2行第8列", "第2行第9列", ""));
        builder.addRow(List.of("第3行", "", "", "", "", "", "", "", "", ""));
        builder.addRow(List.of("第4行第1列", image, "", "第4行第4列", "", "", "", "第4行第8列", "第4行第9列", "第4行第10列"));
        builder.addRow(List.of("第5行第1列", "", "", "", "", "", "", "第5行第8列", "第5行第9列", "第5行第10列"));
        builder.addRow(List.of("第6行第1列", "第6行第2列", "第6行第3列", "", "", "", "", "第6行第8列", "第6行第9列", "第6行第10列"));
        // 3. 声明合并区域
        // 第一行的合并
        builder.merge(1, 1, 2, 1);  // 第1列合并2行
        builder.merge(1, 2, 2, 2);  // 第2列合并2行
        builder.merge(1, 3, 2, 3);  // 第3列合并2行
        builder.merge(1, 4, 2, 4);  // 第4列合并2行
        builder.merge(1, 5, 1, 9);  // 第5列合并5列
        builder.merge(1, 10, 2, 10);  // 第10列合并2行
        // 第三行合并
        builder.merge(3, 1, 3, 10);  // 整行合并
        // 第四行的合并
        builder.merge(4, 2, 5, 3);  // 第2列跨2行2列
        builder.merge(4, 4, 6, 7);  // 第4列跨3行4列
        // 4. 生成表格
        PdfPTable table = builder.build();
        document.add(table);
        document.close();
    }

    @GetMapping
    public void index(HttpServletResponse response) throws IOException {
        Document document = new Document();
        PdfWriter.getInstance(document, response.getOutputStream());
        document.open();

        PdfPTable table = new PdfPTable(10);

        table.addCell(createCell("第1行第1列", 1, 2));
        table.addCell(createCell("第1行第2列", 1, 2));
        table.addCell(createCell("第1行第3列", 1, 2));
        table.addCell(createCell("第1行第4列", 1, 2));
        table.addCell(createCell("第1行第5列", 5, 1));
        table.addCell(createCell("第1行第10列", 1, 2));

        table.addCell(createCell("第2行第5列"));
        table.addCell(createCell("第2行第6列"));
        table.addCell(createCell("第2行第7列"));
        table.addCell(createCell("第2行第8列"));
        table.addCell(createCell("第2行第9列"));

        table.addCell(createCell("第3行", 10, 1));

        table.addCell(createCell("第4行第1列"));
        table.addCell(createCell("第4行第2列", 2, 2));
        table.addCell(createCell("第4行第4列", 4, 3));
        table.addCell(createCell("第4行第8列"));
        table.addCell(createCell("第4行第9列"));
        table.addCell(createCell("第4行第10列"));

        table.addCell(createCell("第5行第1列"));
        table.addCell(createCell("第5行第8列"));
        table.addCell(createCell("第5行第9列"));
        table.addCell(createCell("第5行第10列"));

        table.addCell(createCell("第6行第1列"));
        table.addCell(createCell("第6行第2列"));
        table.addCell(createCell("第6行第3列"));
        table.addCell(createCell("第6行第8列"));
        table.addCell(createCell("第6行第9列"));
        table.addCell(createCell("第6行第10列"));

        document.add(table);

        document.close();
    }

    public static PdfPCell createCell(String text, int colspan, int rowspan) {
        PdfPCell cell = new PdfPCell(new Paragraph(text, baseFont));
        cell.setColspan(colspan);
        cell.setRowspan(rowspan);
        return cell;
    }

    public static PdfPCell createCell(String text) {
        return new PdfPCell(new Paragraph(text, baseFont));
    }
}
